#ifndef QUERYTODASLASFORMACIONES_H_
#define QUERYTODASLASFORMACIONES_H_

#include "Query.h"

class QueryTodasLasFormaciones : public Query{
public:
	QueryTodasLasFormaciones(){};
	virtual ~QueryTodasLasFormaciones(){};

	void execute(ArbolUB<DIMENSION_CLAVES, CANTIDAD_BITS_CLAVES>& arbol, ParametroQuery* parametroQuery, std::string archivoSalida){
		std::cout << "Query Todas Las Formaciones " << archivoSalida << std::endl;
		std::ofstream arch;
		arch.open(archivoSalida);
		if (!arch.good()){
			std::cout << "No se pudo abrir archivo " << archivoSalida << std::endl;
			return;
		}

	    Point<DIMENSION_CLAVES>* min = parametroQuery->getMin();
	    Point<DIMENSION_CLAVES>* max = parametroQuery->getMax();

	    IteradorUB<DIMENSION_CLAVES, CANTIDAD_BITS_CLAVES> iterador(arbol, *min, *max);
	    std::set<u_int32_t> formaciones;

	    auto func = [&formaciones](Point<DIMENSION_CLAVES> point){ formaciones.insert( point[4] ) ; };
        iterador.start(func);

	    for (auto it = formaciones.begin(); it != formaciones.end(); ++it)
	    	arch << *it << std::endl;

	    arch.close();
	}

};

#endif /*QUERYTODASLASFORMACIONES_H_*/
